# -*- coding: utf-8 -*-
require 'pathname'

namespace(:generar) do
  desc "Genera el reporte de la evaluacion en formato csv"
  task :reporte => :environment do
    puts "** Generando Reporte ..."
    def row(*args)
      args.join('|')
    end

    def clear(text)
      text.gsub("\r",'').gsub("\n",'')
    end
    #TODO: check_if========> Evaluacion.all ok?
    Evaluacion.all.each do  |evaluacion|
      puts "** Generando Reporte #{evaluacion.nombre}..."
      started_at = Time.now.utc
      #evaluacion = Evaluacion.find(2)
      evaluados  = Evaluado.all(:order => 'id ASC', :conditions => ['evaluacion_id = ?', evaluacion.id])
      min        = Evaluado.scoped_by_evaluacion_id(evaluacion.id).minimum(:id)
      max        = Evaluado.scoped_by_evaluacion_id(evaluacion.id).maximum(:id)
      total      = evaluados.size
      current    = min

      filename = "reporte_#{evaluacion.nombre_para_archivo}.csv"
      path_to_file = File.join(Rails.root, 'public', 'reportes', filename)

      File.open(path_to_file, 'w') do |f|
        f.puts row('fecha_de_evaluacion', 'mes', 'anio', 'evaluador', 'cargo_evaluador', 'filial_evaluador', 'area_evaluador', 'evaluado', 'cargo_evaluado', 'filial_evaluado', 'area_evaluado', 'evaluado_por', 'descripción_de_competencias_pregunta', 'calificacion', 'calif_o_valor', 'valor_max', 'comentarios', 'tipo_de_competencia', 'competencia')

        while (current <= max) do

          batch = current + 50
          Evaluado.find(:all, :order => 'id ASC', :conditions => ['estado = ? AND id >= ? AND id <= ? AND evaluacion_id = ?', 'completa', current, batch,evaluacion.id]).each do |evaluado|
            usuario_evaluado = evaluado.usuario_evaluado
            usuario_evaluado_datos        = usuario_evaluado.datos.por_evaluacion(evaluacion).first
            evaluador        = evaluado.usuario
            evaluador_datos        = evaluador.datos.por_evaluacion(evaluacion).first
            preguntas        = usuario_evaluado.preguntas.por_evaluacion(evaluacion)
            preguntas.each do |pregunta|
              respuesta = pregunta.respuestas.evaluado(usuario_evaluado.id).evaluador(evaluador.id).first
              if respuesta
                pregunta_opcion = pregunta.opciones.find(:first, :conditions => ['valor = ?', respuesta.valor])
                f.puts row(evaluacion.strf_fecha,
                  evaluacion.fecha ? evaluacion.fecha.strftime("%B") : '-',
                  evaluacion.fecha ? evaluacion.fecha.year : '-',
                  evaluador.nombre || '-',
                  evaluador_datos.cargo ,
                  evaluador_datos.filial,
                  evaluador_datos.area,
                  (usuario_evaluado && usuario_evaluado.nombre) ? usuario_evaluado.nombre : '-',
                  usuario_evaluado_datos.cargo,
                  usuario_evaluado_datos.filial,
                  usuario_evaluado_datos.area,
                  respuesta.tipo_evaluador ? respuesta.tipo_evaluador : '-',
                  pregunta.texto ? clear(pregunta.texto) : '-',
                  (pregunta_opcion && pregunta_opcion.texto) ? clear(pregunta_opcion.texto) : '-',
                  respuesta.valor ? respuesta.valor.to_s.gsub('.',',') : '0.0',
                  #respuesta.valor ? respuesta.valor : '0.0',
                  pregunta.maxima_opcion ? pregunta.maxima_opcion.to_s.gsub('.',',') : '0.0',
                  #pregunta.maxima_opcion ? pregunta.maxima_opcion : '0.0',
                  respuesta.comentario ? clear(respuesta.comentario) : '-',
                  pregunta.competencia_tipo,
                  pregunta.competencia_nombre)
              end
            end
            print "."
            $stdout.flush
          end
          4.times { sleep 0.25 }
          current = batch + 1
        end

      end
      puts
      puts "** #{total} registros procesados **"
    end
  end
end

